#include "CMyWindow.h"

#include <QDebug>
#include <QDomDocument>
#include <QFile>
#include <QTextStream>

#define GEOMETRY_TAG "Geometry"
#define WIDTH_TAG "Width"
#define HEIGHT_TAG "Height"
#define X_TAG "X"
#define Y_TAG "Y"

CMyWindow::CMyWindow(QWidget* parent)
    : QWidget(parent)
{
}

void CMyWindow::LoadSizeFromFile(QWidget* pThis, const QString& filename)
{
    QFile file(filename);

    if (!file.exists()) {
        return;
    }

    int x = 0;
    int y = 0;
    int width = 0;
    int height = 0;

    // 若文件存在，读取文件中的坐标信息并改变窗体
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QDomDocument doc;

        // 读取 xml 文件
        if (!doc.setContent(&file, false)) {
            file.close();
            return;
        }

        // 获取根元素
        QDomElement root = doc.documentElement();

        QDomElement geometryElement = root.firstChildElement(GEOMETRY_TAG);
        if (!geometryElement.isNull()) {
            // 获取x节点
            QDomElement xElement = geometryElement.firstChildElement(X_TAG);
            if (!xElement.isNull()) {
                x = xElement.firstChild().toText().nodeValue().toInt();
            }

            // 获取y节点
            QDomElement yElement = geometryElement.firstChildElement(Y_TAG);
            if (!yElement.isNull()) {
                y = yElement.firstChild().toText().nodeValue().toInt();
            }

            // 获取width节点
            QDomElement widthElement = geometryElement.firstChildElement(WIDTH_TAG);
            if (!widthElement.isNull()) {
                width = widthElement.firstChild().toText().nodeValue().toInt();
            }

            // 获取height节点
            QDomElement heightElement = geometryElement.firstChildElement(HEIGHT_TAG);
            if (!heightElement.isNull()) {
                height = heightElement.firstChild().toText().nodeValue().toInt();
            }

            // 设置坐标大小
            if (width > 0 && height > 0 && x > 0 && y > 0) {
                pThis->move(x, y);
                pThis->resize(width, height);
            }
        }
    }
}

void CMyWindow::SaveSizeToFile(QWidget* pThis, const QString& filename, const QString moduleName)
{
    QFile file(filename);
    QDomDocument doc;
    QDomElement root;

    bool bHasX = false;
    bool bHasY = false;
    bool bHasWidth = false;
    bool bHasHeight = false;

    QDomElement geometryElement;

    if (file.exists() && file.open(QIODevice::ReadWrite | QIODevice::Text) && doc.setContent(&file, false)) {
        // 获取根元素
        root = doc.documentElement();

        // 获取geometry节点
        geometryElement = root.firstChildElement(GEOMETRY_TAG);
        if (!geometryElement.isNull()) {
            // 获取x节点
            QDomElement xElement = geometryElement.firstChildElement(X_TAG);
            if (!xElement.isNull()) {
                xElement.firstChild().toText().setNodeValue(QString::number(pThis->x()));
                bHasX = true;
            }

            // 获取y节点
            QDomElement yElement = geometryElement.firstChildElement(Y_TAG);
            if (!yElement.isNull()) {
                yElement.firstChild().toText().setNodeValue(QString::number(pThis->y()));
                bHasY = true;
            }

            // 获取width节点
            QDomElement widthElement = geometryElement.firstChildElement(WIDTH_TAG);
            if (!widthElement.isNull()) {
                widthElement.firstChild().toText().setNodeValue(QString::number(pThis->width()));
                bHasWidth = true;
            }

            // 获取height节点
            QDomElement heightElement = geometryElement.firstChildElement(HEIGHT_TAG);
            if (!heightElement.isNull()) {
                heightElement.firstChild().toText().setNodeValue(QString::number(pThis->height()));
                bHasHeight = true;
            }
        }
    }
    else {
        file.open(QIODevice::WriteOnly | QIODevice::Text);

        // 创建 xml 头部
        QDomProcessingInstruction instruction;
        instruction = doc.createProcessingInstruction("xml", "version = \'1.0\' encoding=\'UTF-8\'");
        doc.appendChild(instruction);

        // 创建根节点
        root = doc.createElement(moduleName);
        doc.appendChild(root);
    }

    // 关闭文件，并覆盖写文件
    file.close();
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream out(&file);

    // 判断是否找到几何节点
    if (geometryElement.isNull()) {
        // 创建几何节点
        geometryElement = doc.createElement(GEOMETRY_TAG);
        root.appendChild(geometryElement);
    }

    // x 数据
    if (!bHasX) {
        QDomElement xElement = doc.createElement(X_TAG);
        QDomText xText = doc.createTextNode(QString::number(pThis->pos().x()));
        xElement.appendChild(xText);
        geometryElement.appendChild(xElement);
    }

    // y 数据
    if (!bHasY) {
        QDomElement yElement = doc.createElement(Y_TAG);
        QDomText yText = doc.createTextNode(QString::number(pThis->pos().y()));
        yElement.appendChild(yText);
        geometryElement.appendChild(yElement);
    }

    // width 数据
    if (!bHasWidth) {
        QDomElement widthElement = doc.createElement(WIDTH_TAG);
        QDomText widthText = doc.createTextNode(QString::number(pThis->width()));
        widthElement.appendChild(widthText);
        geometryElement.appendChild(widthElement);
    }

    // height 数据
    if (!bHasHeight) {
        QDomElement heightElement = doc.createElement(HEIGHT_TAG);
        QDomText heightText = doc.createTextNode(QString::number(pThis->height()));
        heightElement.appendChild(heightText);
        geometryElement.appendChild(heightElement);
    }

    root.appendChild(geometryElement);

    doc.save(out, 4);
    file.close();
}

CMyWindow::~CMyWindow()
{
}
